/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package hotelinteligente.controladores;

import hotelinteligente.Dispositivos;
import hotelinteligente.modelo.Alarma;
import hotelinteligente.modelo.Aspersor;
import hotelinteligente.modelo.Camara;
import hotelinteligente.modelo.DetectorHumo;
import hotelinteligente.modelo.Hotel;
import hotelinteligente.vista.mainJFrame;
import java.util.Observable;
import java.util.Observer;

/**
 *
 * @author vero
 */
public class Controlador implements Observer {

    static final private Controlador instancia= new Controlador();
    
    private Alarma alarma;
    
    private Hotel hotel;
    private mainJFrame mainJFrame;

    static public Controlador getInstancia() {
        return instancia;
    }

    private Controlador() {
        this.hotel= new Hotel();
        this.mainJFrame= new mainJFrame();
        this.alarma= null;
    }

    public void correrAplicacion() {
        cargarModelo();
        cargarVista();
    }

    private void cargarModelo() {
        hotel.agregarCamara(Dispositivos.ID_CAMARA1, Dispositivos.PRIMERA_PUERTA);
        hotel.agregarDispositivo(Dispositivos.ID_SENSOR_MOVIMIENTO1, Dispositivos.PRIMERA_PUERTA);
        hotel.agregarDetectorHumo(Dispositivos.ID_DETECTOR_HUMO1, Dispositivos.PRIMERA_PUERTA);
        hotel.agregarAspersor(Dispositivos.ID_ASPERSOR1, Dispositivos.PRIMERA_PUERTA);

        hotel.agregarCamara(Dispositivos.ID_CAMARA2, Dispositivos.SEGUNDA_PUERTA);
        hotel.agregarDispositivo(Dispositivos.ID_SENSOR_MOVIMIENTO2, Dispositivos.SEGUNDA_PUERTA);
        hotel.agregarDispositivo(Dispositivos.ID_DETECTOR_HUMO2, Dispositivos.SEGUNDA_PUERTA);
        hotel.agregarAspersor(Dispositivos.ID_ASPERSOR2, Dispositivos.SEGUNDA_PUERTA);
    }

    private void cargarVista() {
        //PUERTA 1
        mainJFrame.agregarDispositivoDibujable(Dispositivos.ID_CAMARA1, Dispositivos.IMAGEN_CAMARA, Dispositivos.X_CAMARA1, Dispositivos.Y_CAMARA1);
        mainJFrame.agregarDispositivoDibujable(Dispositivos.ID_SENSOR_MOVIMIENTO1, Dispositivos.IMAGEN_SENSOR_MOVIMIENTO, Dispositivos.X_SENSOR_MOVIMIENTO1, Dispositivos.Y_SENSOR_MOVIMIENTO1);
        mainJFrame.agregarDispositivoDibujable(Dispositivos.ID_DETECTOR_HUMO1, Dispositivos.IMAGEN_DETECTOR_HUMO, Dispositivos.X_DETECTOR_HUMO1, Dispositivos.Y_DETECTOR_HUMO1);
        mainJFrame.agregarDispositivoDibujable(Dispositivos.ID_ASPERSOR1, Dispositivos.IMAGEN_ASPERSOR, Dispositivos.X_ASPERSOR1, Dispositivos.Y_ASPERSOR1);       //PUERTA 2
        //PUERTA 2
        mainJFrame.agregarDispositivoDibujable(Dispositivos.ID_CAMARA2, Dispositivos.IMAGEN_CAMARA, Dispositivos.X_CAMARA2, Dispositivos.Y_CAMARA2);
        mainJFrame.agregarDispositivoDibujable(Dispositivos.ID_SENSOR_MOVIMIENTO2, Dispositivos.IMAGEN_SENSOR_MOVIMIENTO, Dispositivos.X_SENSOR_MOVIMIENTO2, Dispositivos.Y_SENSOR_MOVIMIENTO2);
        mainJFrame.agregarDispositivoDibujable(Dispositivos.ID_DETECTOR_HUMO2, Dispositivos.IMAGEN_DETECTOR_HUMO, Dispositivos.X_DETECTOR_HUMO2, Dispositivos.Y_DETECTOR_HUMO2);
        mainJFrame.agregarDispositivoDibujable(Dispositivos.ID_ASPERSOR2, Dispositivos.IMAGEN_ASPERSOR, Dispositivos.X_ASPERSOR2, Dispositivos.Y_ASPERSOR2);       //PUERTA 2

        mainJFrame.setVisible(true);
    }

    public void activarDispositivo(String id) {
        hotel.activarDispositivo(id);
        mainJFrame.dibujarDispositivo(id);
    }

    public void desactivarDispositivo(String id) {
        hotel.desactivarDispositivo(id);
        mainJFrame.noDibujarDispositivo(id);
    }

    public void mostrarCamara(String id) {
        mainJFrame.mostrarCamara(id);
    }

    //ALARMA
    public void update(Observable o, Object object) {
        alarma= (Alarma) object;
        mainJFrame.mostrarAlertaIncendio();
    }

    //Incendio
    public boolean existeAlarma() {
        return true;
    }

    public String getPisoAlarma() {
        return alarma.getPiso();
    }

    public String getPuertaAlarma() {
        return alarma.getPuerta();
    }

    public String getNumeroPuertaAlarma() {
        return alarma.getNumeroPuerta();
    }

    //PRUEBAAAAAA
    public void generarAlarmaIncendio() {
       DetectorHumo dh= (DetectorHumo) hotel.getDispositivo(Dispositivos.ID_DETECTOR_HUMO1);
       Camara camara= (Camara) hotel.getDispositivo(Dispositivos.ID_CAMARA1);
       camara.simularVerIncendio();
       dh.simularDeteccion();
    }

    public boolean hayIncendioEnCamara(String id) {
        Camara camara= (Camara) hotel.getDispositivo(id);
        return camara.hayIncendio();
    }
    
    public boolean hayCamaraPuerta(String id) {
        Camara camara= (Camara) hotel.getDispositivo(id);
        return camara.estaActivo();
    }

    public void alarmaIncendio() {
        Aspersor aspersor1= (Aspersor) hotel.getDispositivo(Dispositivos.ID_ASPERSOR1);
        if(!aspersor1.estaActivo()) {
            aspersor1.activar();
            mainJFrame.dibujarDispositivo(Dispositivos.ID_ASPERSOR1);
        }
        mainJFrame.alarmaIncendio();
    }

}
